package com.taotao.portal.service;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import com.taotao.common.pojo.TaotaoResult;
import com.taotao.common.utils.CookieUtils;
import com.taotao.common.utils.HttpClientUtil;
import com.taotao.common.utils.JsonUtils;
import com.taotao.pojo.TbItem;
import com.taotao.portal.pojo.CartItem;

@Service
public class CartServiceImpl implements CartService {
	@Autowired
	private ItemService itemService;
	@Value("${CART_ITEM_EXPIRE}")
	private Integer CART_ITEM_EXPIRE;

	@Value("${SSO_BASE_URL}")
	private String SSO_BASE_URL;
	@Value("${SSO_USER_GET_CART_URL}")
	private String SSO_USER_GET_CART_URL;
	@Value("${SSO_USER_SET_CART_URL}")
	private String SSO_USER_SET_CART_URL;
	

	/**
	 * redis缓存中:删除用户购物车指定商品
	 */
	@Override
	public TaotaoResult deleteRedisCartItem(long itemId,
			HttpServletRequest request, HttpServletResponse response) {
		List<CartItem> cartItemList = getCartItemListByRedis(request);
		for (CartItem cartItem : cartItemList) {
			// 删除对应id的商品
			if (cartItem.getId() == itemId) {
				cartItemList.remove(cartItem);
				break;
			}
		}
		// 再将购物车列表信息放入cookie中
		String json = JsonUtils.objectToJson(cartItemList);
		String token = CookieUtils.getCookieValue(request, "TT_TOKEN", true);
		HttpClientUtil.doPostJson(SSO_BASE_URL + SSO_USER_SET_CART_URL + token,
				json);
		return TaotaoResult.ok();
	}

	/**
	 * redis缓存中用户:购物车商品数量更改
	 */
	@Override
	public TaotaoResult updateRedisCartItemNum(long itemId, Integer itemNum,
			HttpServletRequest request, HttpServletResponse response) {
		List<CartItem> cartItemList = getCartItemListByRedis(request);
		for (CartItem cartItem : cartItemList) {
			// 遍历修改对应商品id的商品数量
			if (cartItem.getId() == itemId) {
				cartItem.setCartItemNum(itemNum);
				break;
			}
		}
		// 再将购物车列表信息放入cookie中
		String json = JsonUtils.objectToJson(cartItemList);
		String token = CookieUtils.getCookieValue(request, "TT_TOKEN", true);
		HttpClientUtil.doPostJson(SSO_BASE_URL + SSO_USER_SET_CART_URL + token,
				json);
		return TaotaoResult.ok();
	}

	/**
	 * 用户登录状态向redis添加购物车列表缓存
	 */
	public TaotaoResult addCartToRedis(long itemId, Integer itemNum,
			HttpServletRequest request, HttpServletResponse response) {
		// 获取商品列表
		List<CartItem> cartItemList = getCartItemListByRedis(request);
		// 确定商品是否存在的变量
		boolean haveflg = false;
		// 遍历列表
		for (CartItem cartItem : cartItemList) {
			// 如果商品已经在购物车,则改变商品数量
			if (cartItem.getId() == itemId) {
				Integer cartItemNum = cartItem.getCartItemNum();
				cartItem.setCartItemNum(cartItemNum + itemNum);
				haveflg = true;
				break;
			}
		}

		// 如果商品不存在于购物车中,则添加新商品到购物车列表
		if (!haveflg) {
			TbItem tbItem = itemService.getItemById(itemId);
			CartItem cartItem = new CartItem();
			cartItem.setId(tbItem.getId());
			cartItem.setTitle(tbItem.getTitle());
			cartItem.setPrice(tbItem.getPrice());
			cartItem.setCartItemNum(itemNum);
			String image = tbItem.getImage();
			// 取一张图片
			if (StringUtils.isNotBlank(image)) {
				String[] images = image.split(",");
				cartItem.setImage(images[0]);
			}
			// 向购物车列表添加新商品
			cartItemList.add(cartItem);
		}
		// 将购物车列表信息放入redis中
		String json = JsonUtils.objectToJson(cartItemList);
		String token = CookieUtils.getCookieValue(request, "TT_TOKEN", true);
		HttpClientUtil.doPostJson(SSO_BASE_URL + SSO_USER_SET_CART_URL + token,
				json);
		return TaotaoResult.ok();
	}

	/**
	 * cookie与redis中的CartItemList合并
	 */
	/*
	 * private List<CartItem> mergeCartItems(HttpServletRequest request,
	 * HttpServletResponse response, List<CartItem> redisList) { List<CartItem>
	 * cookieList = getCartItemList(request); if (cookieList.isEmpty()) {
	 * 
	 * return redisList; } if (redisList == null) { return cookieList; } //
	 * 实现双购物车列表合并 List<CartItem> resultList = new ArrayList<CartItem>(); for
	 * (CartItem rCart : redisList) { long id = rCart.getId(); int num =
	 * rCart.getCartItemNum(); for (CartItem cCart : cookieList) { if
	 * (cCart.getId() == id) { rCart.setCartItemNum(num +
	 * cCart.getCartItemNum()); cookieList.remove(cCart); break; } }
	 * resultList.add(rCart); } resultList.addAll(cookieList);
	 * CookieUtils.setCookie(request, response, "TT_CART", "", 0); return
	 * resultList; }
	 */

	/**
	 * 用户登录状态从redis缓存中获取购物车列表信息
	 */
	public List<CartItem> getCartItemListByRedis(HttpServletRequest request) {
		try {
			String token = CookieUtils
					.getCookieValue(request, "TT_TOKEN", true);
			String json = HttpClientUtil.doGet(SSO_BASE_URL
					+ SSO_USER_GET_CART_URL + token);
			TaotaoResult result = TaotaoResult.formatToList(json,
					CartItem.class);
			List<CartItem> list = (List<CartItem>) result.getData();
			if (list == null) {
				return new ArrayList<CartItem>();
			}
			return list;
		} catch (Exception e) {
			e.printStackTrace();
			return new ArrayList<CartItem>();
		}
	}

	/**
	 * 添加商品到购物车
	 */
	@Override
	public TaotaoResult addCart(long itemId, Integer itemNum,
			HttpServletRequest request, HttpServletResponse response) {
		// 获取商品列表
		List<CartItem> cartItemList = getCartItemList(request);
		// 确定商品是否存在的变量
		boolean haveflg = false;
		// 遍历列表
		for (CartItem cartItem : cartItemList) {
			// 如果商品已经在购物车,则改变商品数量
			if (cartItem.getId() == itemId) {
				Integer cartItemNum = cartItem.getCartItemNum();
				cartItem.setCartItemNum(cartItemNum + itemNum);
				haveflg = true;
				break;
			}
		}

		// 如果商品不存在于购物车中,则添加新商品到购物车列表
		if (!haveflg) {
			TbItem tbItem = itemService.getItemById(itemId);
			CartItem cartItem = new CartItem();
			cartItem.setId(tbItem.getId());
			cartItem.setTitle(tbItem.getTitle());
			cartItem.setPrice(tbItem.getPrice());
			cartItem.setCartItemNum(itemNum);
			String image = tbItem.getImage();
			// 取一张图片
			if (StringUtils.isNotBlank(image)) {
				String[] images = image.split(",");
				cartItem.setImage(images[0]);
			}
			// 向购物车列表添加新商品
			cartItemList.add(cartItem);
		}
		// 将购物车列表信息放入cookie中
		CookieUtils.setCookie(request, response, "TT_CART",
				JsonUtils.objectToJson(cartItemList), CART_ITEM_EXPIRE, true);
		return TaotaoResult.ok();
	}

	/**
	 * 从Cookie中获取购物车商品列表
	 * 
	 */
	public List<CartItem> getCartItemList(HttpServletRequest request) {
		try {
			// 从cookie中获取商品列表
			String cookieValue = CookieUtils.getCookieValue(request, "TT_CART",
					true);
			if (StringUtils.isBlank(cookieValue)) {
				return new ArrayList<CartItem>();
			}
			// 转换json字符串
			List<CartItem> list = JsonUtils.jsonToList(cookieValue,
					CartItem.class);
			// 判断list是否为空
			if (list == null) {
				return new ArrayList<CartItem>();
			}
			// 不为空直接返回购物车商品列表
			return list;
		} catch (Exception e) {
			return new ArrayList<CartItem>();
		}

	}

	/**
	 * 购物车商品数量更改
	 */
	@Override
	public TaotaoResult updateCartItemNum(long itemId, Integer itemNum,
			HttpServletRequest request, HttpServletResponse response) {
		List<CartItem> cartItemList = getCartItemList(request);
		for (CartItem cartItem : cartItemList) {
			// 遍历修改对应商品id的商品数量
			if (cartItem.getId() == itemId) {
				cartItem.setCartItemNum(itemNum);
				break;
			}
		}
		// 再将购物车列表信息放入cookie中
		CookieUtils.setCookie(request, response, "TT_CART",
				JsonUtils.objectToJson(cartItemList), CART_ITEM_EXPIRE, true);
		return TaotaoResult.ok();
	}

	/**
	 * 删除购物车指定商品
	 */
	@Override
	public TaotaoResult deleteCartItem(long itemId, HttpServletRequest request,
			HttpServletResponse response) {
		List<CartItem> cartItemList = getCartItemList(request);
		for (CartItem cartItem : cartItemList) {
			// 删除对应id的商品
			if (cartItem.getId() == itemId) {
				cartItemList.remove(cartItem);
				break;
			}
		}
		// 再将购物车列表信息放入cookie中
		CookieUtils.setCookie(request, response, "TT_CART",
				JsonUtils.objectToJson(cartItemList), CART_ITEM_EXPIRE, true);
		return TaotaoResult.ok();
	}


}
